{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Deming Regression\n",
    "-------------------------------\n",
    "\n",
    "This function shows how to use TensorFlow to solve linear Deming regression.\n",
    "\n",
    "$y = Ax + b$\n",
    "\n",
    "We will use the iris data, specifically:\n",
    "\n",
    "y = Sepal Length and x = Petal Width.\n",
    "\n",
    "Deming regression is also called total least squares, in which we minimize the shortest distance from the predicted line and the actual (x,y) points.\n",
    "\n",
    "If least squares linear regression minimizes the vertical distance to the line, Deming regression minimizes the total distance to the line.  This type of regression minimizes the error in the y values and the x values.  See the below figure for a comparison.\n",
    "\n",
    "<img src=\"../images/05_demming_vs_linear_reg.png\" width=\"512\">\n",
    "\n",
    "To implement this in TensorFlow, we start by loading the necessary libraries."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from sklearn import datasets\n",
    "from tensorflow.python.framework import ops\n",
    "ops.reset_default_graph()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Start a computational graph session:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "sess = tf.Session()\n",
    "\n",
    "# Set a random seed\n",
    "tf.set_random_seed(42)\n",
    "np.random.seed(42)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We load the iris data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load the data\n",
    "# iris.data = [(Sepal Length, Sepal Width, Petal Length, Petal Width)]\n",
    "iris = datasets.load_iris()\n",
    "x_vals = np.array([x[3] for x in iris.data]) # Petal Width\n",
    "y_vals = np.array([y[0] for y in iris.data]) # Sepal Length"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next we declare the batch size, model placeholders, model variables, and model operations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Declare batch size\n",
    "batch_size = 125\n",
    "\n",
    "# Initialize placeholders\n",
    "x_data = tf.placeholder(shape=[None, 1], dtype=tf.float32)\n",
    "y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)\n",
    "\n",
    "# Create variables for linear regression\n",
    "A = tf.Variable(tf.random_normal(shape=[1,1]))\n",
    "b = tf.Variable(tf.random_normal(shape=[1,1]))\n",
    "\n",
    "# Declare model operations\n",
    "model_output = tf.add(tf.matmul(x_data, A), b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For the demming loss, we want to compute:\n",
    "\n",
    "$$ \\frac{\\left| A \\cdot x + b - y \\right|}{\\sqrt{A^{2} + 1}} $$\n",
    "\n",
    "Which will give us the shortest distance between a point (x,y) and the predicted line, $A \\cdot x + b$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Declare Deming loss function\n",
    "deming_numerator = tf.abs(tf.subtract(tf.add(tf.matmul(x_data, A), b), y_target))\n",
    "deming_denominator = tf.sqrt(tf.add(tf.square(A),1))\n",
    "loss = tf.reduce_mean(tf.truediv(deming_numerator, deming_denominator))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next we declare the optimization function and initialize all model variables."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Declare optimizer\n",
    "my_opt = tf.train.GradientDescentOptimizer(0.25)\n",
    "train_step = my_opt.minimize(loss)\n",
    "\n",
    "# Initialize variables\n",
    "init = tf.global_variables_initializer()\n",
    "sess.run(init)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we train our Deming regression for 250 iterations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Step #100 A = [[3.0726142]] b = [[1.7809945]]\n",
      "Loss = 0.47351116\n",
      "Step #200 A = [[2.4791956]] b = [[2.522906]]\n",
      "Loss = 0.4120035\n",
      "Step #300 A = [[1.7441005]] b = [[3.6184309]]\n",
      "Loss = 0.37118915\n",
      "Step #400 A = [[1.0046556]] b = [[4.5442853]]\n",
      "Loss = 0.26205948\n",
      "Step #500 A = [[0.9638405]] b = [[4.605]]\n",
      "Loss = 0.24394163\n",
      "Step #600 A = [[0.96017563]] b = [[4.6268764]]\n",
      "Loss = 0.26399365\n",
      "Step #700 A = [[1.0218917]] b = [[4.6011143]]\n",
      "Loss = 0.28519714\n",
      "Step #800 A = [[1.0040245]] b = [[4.5968676]]\n",
      "Loss = 0.27684262\n",
      "Step #900 A = [[1.043581]] b = [[4.606966]]\n",
      "Loss = 0.29077518\n",
      "Step #1000 A = [[1.0042043]] b = [[4.6473894]]\n",
      "Loss = 0.25255314\n",
      "Step #1100 A = [[1.0124936]] b = [[4.635666]]\n",
      "Loss = 0.27939135\n",
      "Step #1200 A = [[0.97916406]] b = [[4.575562]]\n",
      "Loss = 0.25290507\n",
      "Step #1300 A = [[1.0078632]] b = [[4.581728]]\n",
      "Loss = 0.2552546\n",
      "Step #1400 A = [[1.0334944]] b = [[4.626392]]\n",
      "Loss = 0.25675926\n",
      "Step #1500 A = [[0.96745807]] b = [[4.6006155]]\n",
      "Loss = 0.2478789\n"
     ]
    }
   ],
   "source": [
    "# Training loop\n",
    "loss_vec = []\n",
    "for i in range(1500):\n",
    "    rand_index = np.random.choice(len(x_vals), size=batch_size)\n",
    "    rand_x = np.transpose([x_vals[rand_index]])\n",
    "    rand_y = np.transpose([y_vals[rand_index]])\n",
    "    sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})\n",
    "    temp_loss = sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})\n",
    "    loss_vec.append(temp_loss)\n",
    "    if (i+1)%100==0:\n",
    "        print('Step #' + str(i+1) + ' A = ' + str(sess.run(A)) + ' b = ' + str(sess.run(b)))\n",
    "        print('Loss = ' + str(temp_loss))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Retrieve the optimal coefficients (slope and intercept)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Get the optimal coefficients\n",
    "[slope] = sess.run(A)\n",
    "[y_intercept] = sess.run(b)\n",
    "\n",
    "# Get best fit line\n",
    "best_fit = []\n",
    "for i in x_vals:\n",
    "  best_fit.append(slope*i+y_intercept)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here is matplotlib code to plot the best fit Deming regression line and the Demming Loss."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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2WUUFRXFqt+wYdVnKCce/5rqxz/+MV988QU9eqTfU/HCCy/k+eef58knn6xewFX43ve+B0QXIW633Xa13h0mItsOJYxakvoApoqqSiatW7fmscceS+7UE8s599xzueyyy5g8eXLyGoyLL76YF154AYA//OEP3HDDDbHi2m233fjyyy/54ovoXo733XcfZsYbb7yBu1NaWsq6detiLUtEtm1KGJvpvvvuA2CHHXaoso6ZccMNN/Duu+9Wmrbffvslr8Go6LDDDkvesPDcc8/lpz/9KaWlpdx+++1sv/32AMm/Vfnggw9o2bJl2nEUgO7du3PyySfTuHHjrLGLiCQU+m61W7zf/va3bNiwgV/+8pdZ6yUSS1Vmz57N8uWV736y0047Ad92ayVaK4n7XPXu3ZvGjRvzu9/9Ljk9cWv11HqJg/WpXn/99bRxd6ekpITdd989a6wism1SC2MzmRm33nore+yxx2Yt54ADDuCoo46qVD5gwADuvPNOjj/++LTyTp06AVErZOedd06Wb84zQR555BH22GMP5s6dW+NliMjWSwmjnmvevDm9e/eu9LyMc845h3nz5tG9e3cuueSS5MHzilelxzVixIjkXXPnz5+/eUGLyFZJCWML1rZtWwCKiop47bXXePvtt/n1r3+Nu6fd2iSO0047TS0LqVXFxcW6Rf9WRgljK9K1a9dkS2T69On85z//YfXq1SxZsiTW/IkrxWXLtWHDBv74xz/mfJZLqrKyMoYMGZJx5z5ixAjeeOONasfx0Ucfsf/++/PAAw9Ue966NHPmTDp06FDp7tGbY/bs2cmzErc2ShhbqZYtW9KlSxeaNWtGixYtADj++ONZsmRJ8ir2qsybN485c+ZknFZeXp6WgNydZ599lvXr19de8JvhjTfe4IADDmDDhg3MmTOn0sOpqmPcuHFpJxAcfvjh9OvXrxairJ7JkyczbNiwrHU2bdrERRddRM+ePendu3e1ruPp378/F1xwAb169ao07bTTTqN79+7VjjnRrZk4M9DdGT9+PDNnzmT8+PHJehMnTmTVqlWxlrl06dJqx5FLv379mDZtGqNGZX4+m7vzk5/8hJEjR2acnsmBBx6Y81hi6v9VHKWlpZSUlFRrnrxw961mOOyww1wyW7Zsma9fvz45/vrrrzuQdXB3HzJkiK9YsSI530033eSAL1u2zMvL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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the result\n",
    "plt.plot(x_vals, y_vals, 'o', label='Data Points')\n",
    "plt.plot(x_vals, best_fit, 'r-', label='Best fit line', linewidth=3)\n",
    "plt.legend(loc='upper left')\n",
    "plt.title('Sepal Length vs Petal Width')\n",
    "plt.xlabel('Petal Width')\n",
    "plt.ylabel('Sepal Length')\n",
    "plt.show()\n",
    "\n",
    "# Plot loss over time\n",
    "plt.plot(loss_vec, 'k-')\n",
    "plt.title('Deming Loss per Generation')\n",
    "plt.xlabel('Iteration')\n",
    "plt.ylabel('Deming Loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
